package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.*;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.AssetAltaForm;
import com.mastercard.assets.web.util.to.UserLogin;
import java.text.SimpleDateFormat;
import java.util.Date;

public class AssetsAltaRegistrar
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		int roleId = user.getActualRoleId( ) ;
		int cveUsuario = user.getCveUsuario() ;
                String codigoPais = "" , nombrePais = "" ; 
                TblUsuario userData = MasterCardDAO.findUserById( cveUsuario ) ;
                
                    codigoPais = userData.getTblPais().getCodigo();
                    nombrePais = userData.getTblPais().getNombre();
                    int cvePais = userData.getTblPais().getCvePais();
                    
                    if( roleId == 6 ) {
                        codigoPais = "Regional" ;
                        nombrePais = "Regional" ;
                        cvePais = 17 ;
                    }
                
		request.setAttribute( "roleId" , roleId ) ;
                request.setAttribute( "cvePais" , cvePais ) ;
		request.setAttribute( "nombrePais" , nombrePais ) ;
		request.setAttribute( "codigoPais" , codigoPais ) ;
		// en caso de null
		if( user == null ) {
                    MasterCardDAO.closeEntityManager( ) ;
                    return mapping.findForward( "noLogin" ) ;
                }
			
		
		// toma el form
		AssetAltaForm f = ( AssetAltaForm ) form ;
		
		int cveCategoria = f.getCategoria( ) ;
		String cambioSelect = f.getCambioSelect( ) ;
		
		
//		System.out.println( "Categoria: " + cveCategoria ) ;
//		System.out.println( "Submit: " + cambioSelect ) ;
//		
		// en caso de que la categoria venga mayor de 0 y el venga del cambio de un select
		if( cveCategoria > 0 && cambioSelect != null && cambioSelect.equals( "si" ) )
		{
			
			try
			{
				List< TblCategoria > categs = MasterCardDAO.getAllActiveCategorias( ) ;
				List< TblCategoria > resCategs = new ArrayList< TblCategoria >( ) ;
				
				if( categs != null && categs.size( ) > 0 )
				{
					for( TblCategoria c : categs )
					{
						List< TblSubcateg > subcategs = c.getTblSubcategs( ) ;
						
						if( subcategs != null && subcategs.size( ) > 0 )
							resCategs.add( c ) ;
					}
				}
				
				// en cso de que no haya registros
				if( resCategs.size( ) == 0 )
				{
					// en caso de que se cumpla, guarda el WorkArea
					user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
					
					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotCategoryWithSubcategoriesRegs" ) ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
				  	return mapping.findForward( "success" ) ;
				}
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                // levanta las agencias
                                List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                                List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				// levanta las categorias
				request.setAttribute( "Categorias" , resCategs ) ;
			}catch( Exception e )
			{
                            MasterCardDAO.closeEntityManager( ) ;
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
				
				request.setAttribute( "Categorias" , new ArrayList< TblCategoria >( ) ) ;
			}
			
			f.setCambioSelect( "" ) ;

			// calcula subcategorias
			TblCategoria categoria = MasterCardDAO.findCategoryById( cveCategoria ) ;
			
			List< TblSubcateg > subcategs = null ;
			
			// guarda en caso de que no sea null
			if( categoria != null )
				subcategs = categoria.getTblSubcategs( ) ;
			// en caso de que sea null
			else
				subcategs = new ArrayList< TblSubcateg >( ) ;
			
			// en caso de que no haya regas
			if( subcategs == null || subcategs.size( ) == 0 )
			{
 				// regresa a la pagina
				user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsAlta.jsp" ) ;
				
				request.setAttribute( "AssetAltaForm" , f ) ;
				
				user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotSubcategoryRegsFromCategory" , categoria.getNombre( ) ) ) ;
				
                                MasterCardDAO.closeEntityManager( ) ;
			  	return mapping.findForward( "success" ) ;
			}
			
			request.setAttribute( "Subcategorias" , subcategs ) ;
			
			// regresa a la pagina
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsAlta.jsp" ) ;
			
			request.setAttribute( "AssetAltaForm" , f ) ;
			
			user.clearMessageError( ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
		  	return mapping.findForward( "success" ) ;
			
		}
		
		System.out.println( "AssetsAltaRegistrar: cveCategoria - " + cveCategoria ) ;
		System.out.println( "AssetsAltaRegistrar: cambioSelect- " + cambioSelect ) ;
		
		
		// en caso de que venga cveCategoria en 0 y venga de cambio de select
		if( cveCategoria == 0 && cambioSelect != null && cambioSelect.equals( "si" ) )
		{
			
			try
			{
				List< TblCategoria > categs = MasterCardDAO.getAllActiveCategorias( ) ;
				List< TblCategoria > resCategs = new ArrayList< TblCategoria >( ) ;
				
				if( categs != null && categs.size( ) > 0 )
				{
					for( TblCategoria c : categs )
					{
						List< TblSubcateg > subcategs = c.getTblSubcategs( ) ;
						
						if( subcategs != null && subcategs.size( ) > 0 )
							resCategs.add( c ) ;
					}
				}
				
				// en cso de que no haya registros
				if( resCategs.size( ) == 0 )
				{
					// en caso de que se cumpla, guarda el WorkArea
					user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
					
					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotCategoryWithSubcategoriesRegs" ) ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
				  	return mapping.findForward( "success" ) ;
				}
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                // levanta las agencias
                                List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                                List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				// levanta las categorias
				request.setAttribute( "Categorias" , resCategs ) ;
			}catch( Exception e )
			{
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                // levanta las agencias
                                List< TblAgencia > agenciaLista = null ;
                                List< TblFlujoAutorizacion > lfa = null ;
                try {
                    agenciaLista = MasterCardDAO.getAllActiveAgencies( );
                    MasterCardDAO.closeEntityManager( ) ;
                } catch (MasterCardException ex) {
                    MasterCardDAO.closeEntityManager( ) ;
                    Logger.getLogger(AssetsAltaRegistrar.class.getName()).log(Level.SEVERE, null, ex);
                }
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				request.setAttribute( "Categorias" , new ArrayList< TblCategoria >( ) ) ;
			}
			
			f.setSubcategoria( 0 ) ;
			
			request.setAttribute( "AssetAltaForm" , f ) ;
			request.setAttribute( "Subcategorias" , new ArrayList< TblSubcateg >( ) ) ;
			
			// regresa a la pagina
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsAlta.jsp" ) ;
			
			user.clearMessageError( ) ;
			
			f.setCambioSelect( "" ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
		  	return mapping.findForward( "success" ) ;
		}
		
		System.out.println( "Pasa a agregar registro" ) ;
		
		try
		{
			MasterCardDAO.addNewAsset( 
					f.getSubcategoria( ) , 
					f.getNombre( ) , 
					f.getDescripcion( ) , 
					f.getSencilloLocalF( ) , 
					f.getDobleLocalF( ) , 
					f.getSencilloRegionalF( ) , 
					f.getDobleRegionalF( ) , 
					f.getEventDateF( ) , 
					f.getEntregabcDateF( ) , 
					f.getAprobacionbcDateF( ) , 
					f.getSolicitarCotizacionDateF( ) , 
					f.getRequisicionCompraDateF( ) , 
					f.getSubirContratoDateF( ) , 
					f.getSubirPrimeraFacturaDateF( ) , 
					f.getConfirmacionSedeDateF( ) , 
					f.getFinCampanaDateF( ) , 
					f.getSubirSegundaFacturaDateF( ) , 
					f.getEntregaAgendaDateF( ) , 
					f.getEntregaGanadoresDateF( ) , 
					f.getEntregaBoletosDateF( ) , 
					f.getSalidaViajeDateF( ) , 
					f.getRegresoViajeDateF( ) , 
					f.getEvaluacionDateF( ) , 
					( ( f.getFechasConfirmadas( ) != null && f.getFechasConfirmadas( ).equals( "true" ) ? 1 : 2 ) ) , 
					f.getNumeroDiasViajeI( ) , 
					f.getFlujoImplEvento( ) , 
					f.getFlujoCampEvento( ) , 
					f.getTipoMoneda( ) , 
					f.getTipoHabitacion( ),
					f.geCvePais( ) ,
                                        f.getCveAgencia( ),
                                        f.getCveFlujoDeAutorizacion()
					) ;
		}catch( MasterCardException mce )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			try
			{
				List< TblCategoria > categs = MasterCardDAO.getAllActiveCategorias( ) ;
				List< TblCategoria > resCategs = new ArrayList< TblCategoria >( ) ;
				
				if( categs != null && categs.size( ) > 0 )
				{
					for( TblCategoria c : categs )
					{
						List< TblSubcateg > subcategs = c.getTblSubcategs( ) ;
						
						if( subcategs != null && subcategs.size( ) > 0 )
							resCategs.add( c ) ;
					}
				}
				
				// en cso de que no haya registros
				if( resCategs.size( ) == 0 )
				{
					// en caso de que se cumpla, guarda el WorkArea
					user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
					
					user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.usuario.ThereIsNotCategoryWithSubcategoriesRegs" ) ) ;
					
                                        MasterCardDAO.closeEntityManager( ) ;
				  	return mapping.findForward( "success" ) ;
				}
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                 // levanta las agencias
                                List< TblAgencia > agenciaLista = MasterCardDAO.getAllActiveAgencies( ) ;
                                List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				// levanta las categorias
				request.setAttribute( "Categorias" , resCategs ) ;
			}catch( Exception e )
			{
                            MasterCardDAO.closeEntityManager( ) ;
				
				// levanta los flujos de tipo implementacion
				List< TblFlujo > flujosImplementacion = MasterCardDAO.getAllActiveImplementationFlows( ) ;
				// levanta los flujos de tipo campania
				List< TblFlujo > flujosCampania = MasterCardDAO.getAllActiveCampaignFlows( ) ;
                                // levanta las agencias
                                List< TblAgencia > agenciaLista = null ;
                                List< TblFlujoAutorizacion > lfa = MasterCardDAO.getAllFlujosAut( ) ;
                try {
                    agenciaLista = MasterCardDAO.getAllActiveAgencies( );
                    lfa = MasterCardDAO.getAllFlujosAut( ) ;
                } catch (MasterCardException ex) {
                    MasterCardDAO.closeEntityManager( ) ;
                    Logger.getLogger(AssetsAltaRegistrar.class.getName()).log(Level.SEVERE, null, ex);
                }
				
				request.setAttribute( "FlujosImplementacion" , flujosImplementacion ) ;
				request.setAttribute( "FlujosCampania" , flujosCampania ) ;
                                request.setAttribute( "Agencias" , agenciaLista ) ;
                                request.setAttribute( "FlujosAut" , lfa ) ;
				
				request.setAttribute( "Categorias" , new ArrayList< TblCategoria >( ) ) ;
			}
			
				// regresa a la pagina
			user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsAlta.jsp" ) ;
			
			request.setAttribute( "AssetAltaForm" , f ) ;
			
			user.setMessageError( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.asset.nuevo.dao.ErrorAddingAgency" , mce ) ) ;
			
			// calcula subcategorias
			TblCategoria categoria = MasterCardDAO.findCategoryById( cveCategoria ) ;
			
			List< TblSubcateg > subcategs = null ;
			
			// guarda en caso de que no sea null
			if( categoria != null )
				subcategs = categoria.getTblSubcategs( ) ;
			// en caso de que sea null
			else
				subcategs = new ArrayList< TblSubcateg >( ) ;
			
			request.setAttribute( "Subcategorias" , subcategs ) ;
			
                        MasterCardDAO.closeEntityManager( ) ;
		  	return mapping.findForward( "success" ) ;
		}
		
                if(  roleId != 6 ) {
                    // en caso de que se cumpla, guarda el WorkArea
                    user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsIndex.jsp" ) ;
                } else {
                    user.setNextWorkArea( "/WEB-INF/pages/WorkArea/AssetsRegionalIndex.jsp" ) ;
                }
		
		                
		try
		{
                     List< TblAsset > allAssets = new ArrayList< TblAsset > ( ) ;
                    if(  roleId != 6 ) {
                        //request.setAttribute( "Assets" , MasterCardDAO.getAllActiveAssets( ) ) ;
                    allAssets = MasterCardDAO.getAllActiveAssetsByPais( cvePais ) ;
                    }else {
                        //request.setAttribute( "Assets" , MasterCardDAO.getAllActiveAssets( ) ) ;
                    allAssets = MasterCardDAO.getAllActiveAssetsByRegional( ) ;
                    }
			
                        
                        List< TblAsset > oldAssets = new ArrayList< TblAsset >( ) , postAssets  = new ArrayList< TblAsset >( ) ;
                        SimpleDateFormat formato = new SimpleDateFormat("yyyyMMdd") ;
                        // toma la fecha actual
                        Date fec = new Date();                        
                        String cadenaFecha = formato.format(fec);
                        int fecActual = Integer.parseInt( cadenaFecha ) , AssetFec ;
                        String fe ;
                        
                        for ( TblAsset n : allAssets ){
                            Date fecAsset = n.getFecha() ;
                            fe = formato.format(fecAsset) ;
                            AssetFec = Integer.parseInt( fe ) ;
                            
                            if ( fecActual > AssetFec  ){
                                oldAssets.add( n ) ;
                            }else{
                                postAssets.add( n ) ;
                            }
                            
                        }
			                        
                        System.out.println( "anterior::: " + oldAssets.size() + " Actual::: " + postAssets.size() ) ;
			request.setAttribute( "Assets" , allAssets ) ;
                        request.setAttribute( "antAssets" , oldAssets ) ;
                        request.setAttribute( "postAssets" , postAssets ) ;
                    
		}catch( Exception e )
		{
			request.setAttribute( "Assets" , new ArrayList< TblAsset >( ) ) ;
		}
		
		user.clearMessageError( ) ;
		
                MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
	
}
